package weworkgo

import "encoding/xml"

type ProviderTokenResponse struct {
	ProviderAccessToken string `json:"provider_access_token"`
	ExpiresIn           int    `json:"expires_in"`
}

type WechatCorpTpToken struct {
	SuiteId     string
	AccessToken string
}

type WechatCorpTpAuthTokenResponse struct {
	Errcode     int    `json:"errcode"`
	Errmsg      string `json:"errmsg"`
	AccessToken string `json:"access_token"`
	ExpiresIn   int    `json:"expires_in"`
}

type LoginInfoResponse struct {
	Errcode  int    `json:"errcode"`
	Errmsg   string `json:"errmsg"`
	Usertype int    `json:"usertype"`
	UserInfo struct {
		Userid     string `json:"userid"`
		OpenUserid string `json:"open_userid"`
		Name       string `json:"name"`
		Avatar     string `json:"avatar"`
	} `json:"user_info"`
	CorpInfo struct {
		Corpid string `json:"corpid"`
	} `json:"corp_info"`
	Agent []struct {
		Agentid  int `json:"agentid"`
		AuthType int `json:"auth_type"`
	} `json:"agent"`
	AuthInfo struct {
		Department []struct {
			ID       int  `json:"id"`
			Writable bool `json:"writable"`
		} `json:"department"`
	} `json:"auth_info"`
}

type RegisterCodeRequest struct {
	TemplateID  string `json:"template_id"`
	CorpName    string `json:"corp_name"`
	AdminName   string `json:"admin_name"`
	AdminMobile string `json:"admin_mobile"`
	State       string `json:"state"`
	FollowUser  string `json:"follow_user"`
}
type RegisterCodeResponse struct {
	Errcode      int    `json:"errcode"`
	Errmsg       string `json:"errmsg"`
	RegisterCode string `json:"register_code"`
	ExpiresIn    int    `json:"expires_in"`
}

type RegisterInfoResponse struct {
	Errcode     int    `json:"errcode"`
	Errmsg      string `json:"errmsg"`
	Corpid      string `json:"corpid"`
	ContactSync struct {
		AccessToken string `json:"access_token"`
		ExpiresIn   int    `json:"expires_in"`
	} `json:"contact_sync"`
	AuthUserInfo struct {
		Userid string `json:"userid"`
	} `json:"auth_user_info"`
	State      string `json:"state"`
	TemplateID string `json:"template_id"`
}

type AgentScopeRequest struct {
	Agentid    int      `json:"agentid"`
	AllowUser  []string `json:"allow_user"`
	AllowParty []int    `json:"allow_party"`
	AllowTag   []int    `json:"allow_tag"`
}
type AgentScopeResponse struct {
	Errcode      int      `json:"errcode"`
	Errmsg       string   `json:"errmsg"`
	Invaliduser  []string `json:"invaliduser"`
	Invalidparty []int    `json:"invalidparty"`
	Invalidtag   []int    `json:"invalidtag"`
}

type SearchContactRequest struct {
	AuthCorpid     string `json:"auth_corpid"`
	QueryWord      string `json:"query_word"`
	QueryType      int    `json:"query_type"`
	Agentid        int    `json:"agentid"`
	Offset         int    `json:"offset"`
	Limit          int    `json:"limit"`
	FullMatchField int    `json:"full_match_field"`
}
type SearchContactResponse struct {
	Errcode     int    `json:"errcode"`
	Errmsg      string `json:"errmsg"`
	IsLast      bool   `json:"is_last"`
	QueryResult struct {
		User struct {
			Userid     []string `json:"userid"`
			OpenUserid []string `json:"open_userid"`
		} `json:"user"`
		Party struct {
			DepartmentID []int `json:"department_id"`
		} `json:"party"`
	} `json:"query_result"`
}

type PreAuthCodeResponse struct {
	Errcode     int    `json:"errcode"`
	Errmsg      string `json:"errmsg"`
	PreAuthCode string `json:"pre_auth_code"`
	ExpiresIn   int    `json:"expires_in"`
}

type SetSessionRequest struct {
	PreAuthCode string `json:"pre_auth_code"`
	SessionInfo struct {
		Appid    []int `json:"appid"`
		AuthType int   `json:"auth_type"`
	} `json:"session_info"`
}

type ErrResponse struct {
	Errcode int    `json:"errcode"`
	Errmsg  string `json:"errmsg"`
}

type PermanentByCodeResponse struct {
	Errcode        int    `json:"errcode"`
	Errmsg         string `json:"errmsg"`
	AccessToken    string `json:"access_token"`
	ExpiresIn      int    `json:"expires_in"`
	PermanentCode  string `json:"permanent_code"`
	DealerCorpInfo struct {
		Corpid   string `json:"corpid"`
		CorpName string `json:"corp_name"`
	} `json:"dealer_corp_info"`
	AuthCorpInfo struct {
		Corpid            string `json:"corpid"`
		CorpName          string `json:"corp_name"`
		CorpType          string `json:"corp_type"`
		CorpSquareLogoURL string `json:"corp_square_logo_url"`
		CorpUserMax       int    `json:"corp_user_max"`
		CorpAgentMax      int    `json:"corp_agent_max"`
		CorpFullName      string `json:"corp_full_name"`
		VerifiedEndTime   int    `json:"verified_end_time"`
		SubjectType       int    `json:"subject_type"`
		CorpWxqrcode      string `json:"corp_wxqrcode"`
		CorpScale         string `json:"corp_scale"`
		CorpIndustry      string `json:"corp_industry"`
		CorpSubIndustry   string `json:"corp_sub_industry"`
		Location          string `json:"location"`
	} `json:"auth_corp_info"`
	AuthInfo struct {
		Agent []struct {
			Agentid       int    `json:"agentid"`
			Name          string `json:"name"`
			RoundLogoURL  string `json:"round_logo_url"`
			SquareLogoURL string `json:"square_logo_url"`
			Appid         int    `json:"appid"`
			Privilege     struct {
				Level      int      `json:"level"`
				AllowParty []int    `json:"allow_party"`
				AllowUser  []string `json:"allow_user"`
				AllowTag   []int    `json:"allow_tag"`
				ExtraParty []int    `json:"extra_party"`
				ExtraUser  []string `json:"extra_user"`
				ExtraTag   []int    `json:"extra_tag"`
			} `json:"privilege,omitempty"`
			SharedFrom struct {
				Corpid string `json:"corpid"`
			} `json:"shared_from"`
		} `json:"agent"`
	} `json:"auth_info"`
	AuthUserInfo struct {
		Userid     string `json:"userid"`
		OpenUserid string `json:"open_userid"`
		Name       string `json:"name"`
		Avatar     string `json:"avatar"`
	} `json:"auth_user_info"`
	RegisterCodeInfo struct {
		RegisterCode string `json:"register_code"`
		TemplateID   string `json:"template_id"`
		State        string `json:"state"`
	} `json:"register_code_info"`
}

type AuthorizationResponse struct {
	Errcode        int    `json:"errcode"`
	Errmsg         string `json:"errmsg"`
	DealerCorpInfo struct {
		Corpid   string `json:"corpid"`
		CorpName string `json:"corp_name"`
	} `json:"dealer_corp_info"`
	AuthCorpInfo struct {
		Corpid            string `json:"corpid"`
		CorpName          string `json:"corp_name"`
		CorpType          string `json:"corp_type"`
		CorpSquareLogoURL string `json:"corp_square_logo_url"`
		CorpUserMax       int    `json:"corp_user_max"`
		CorpAgentMax      int    `json:"corp_agent_max"`
		CorpFullName      string `json:"corp_full_name"`
		VerifiedEndTime   int    `json:"verified_end_time"`
		SubjectType       int    `json:"subject_type"`
		CorpWxqrcode      string `json:"corp_wxqrcode"`
		CorpScale         string `json:"corp_scale"`
		CorpIndustry      string `json:"corp_industry"`
		CorpSubIndustry   string `json:"corp_sub_industry"`
		Location          string `json:"location"`
	} `json:"auth_corp_info"`
	AuthInfo struct {
		Agent []struct {
			Agentid       int    `json:"agentid"`
			Name          string `json:"name"`
			RoundLogoURL  string `json:"round_logo_url"`
			SquareLogoURL string `json:"square_logo_url"`
			Appid         int    `json:"appid"`
			Privilege     struct {
				Level      int      `json:"level"`
				AllowParty []int    `json:"allow_party"`
				AllowUser  []string `json:"allow_user"`
				AllowTag   []int    `json:"allow_tag"`
				ExtraParty []int    `json:"extra_party"`
				ExtraUser  []string `json:"extra_user"`
				ExtraTag   []int    `json:"extra_tag"`
			} `json:"privilege,omitempty"`
			SharedFrom struct {
				Corpid string `json:"corpid"`
			} `json:"shared_from"`
		} `json:"agent"`
	} `json:"auth_info"`
}

type ManagersResponse struct {
	Errcode int    `json:"errcode"`
	Errmsg  string `json:"errmsg"`
	Admin   []struct {
		Userid     string `json:"userid"`
		OpenUserid string `json:"open_userid"`
		AuthType   int    `json:"auth_type"`
	} `json:"admin"`
}

type UserByCodeResponse struct {
	//1 当用户属于某个企业，返回示例如下：
	Errcode  int    `json:"errcode"`
	Errmsg   string `json:"errmsg"`   //对返回码的文本描述内容
	CorpID   string `json:"CorpId"`   //用户所属企业的corpid;用户是家长时，返回的是家长关注的学校corpid列表，多个corpid用‘|’分隔。注：当家长从某个学校进入应用时，只返回该学校的corpid。
	UserId   string `json:"UserId"`   //用户在企业内的UserID，如果该企业与第三方应用有授权关系时，返回明文UserId，否则返回密文UserId
	DeviceID string `json:"DeviceId"` //手机设备号(由企业微信在安装时随机生成，删除重装会改变，升级不受影响)

	UserTicket string `json:"user_ticket"`
	ExpiresIn  int    `json:"expires_in"`
	//2当用户为学校的家长时，返回示例如下：
	ExternalUserid string     `json:"external_userid"` //家长的外部联系人id，开发者再通过获取外部联系人详情接口可以取到foreign_key，该字段就是对应家校通讯录里面的家长userid
	Parents        []struct { //家长列表
		Corpid       string `json:"corpid"`        //家长所在学校的corpid
		ParentUserid string `json:"parent_userid"` //家长在家校通讯录里的parent_userid
	} `json:"parents"`
	OpenId string `json:"OpenId"` //非企业成员的标识，对当前服务商唯一

}

type UserByTicketResponse struct {
	Errcode int    `json:"errcode"`
	Errmsg  string `json:"errmsg"`
	Corpid  string `json:"corpid"`
	Userid  string `json:"userid"`
	Name    string `json:"name"`
	Gender  string `json:"gender"`
	Avatar  string `json:"avatar"`
	QrCode  string `json:"qr_code"`
}

type SuiteTokenRespons struct {
	Errcode          int    `json:"errcode"`
	Errmsg           string `json:"errmsg"`
	SuiteAccessToken string `json:"suite_access_token"`
	ExpiresIn        int    `json:"expires_in"`
}

type WechatCorpTpInfoData struct {
	XMLName     xml.Name `xml:"xml"`
	SuiteId     string   `xml:"SuiteId"`
	InfoType    string   `xml:"InfoType"`
	TimeStamp   string   `xml:"TimeStamp"`
	SuiteTicket string   `xml:"SuiteTicket"`
	AuthCode    string   `xml:"AuthCode"`
	AuthCorpId  string   `xml:"AuthCorpId"`
	EchoStr     string
}

type MessageSendResponse struct {
	Errcode      int    `json:"errcode"`
	Errmsg       string `json:"errmsg"`
	Invaliduser  string `json:"invaliduser"`
	Invalidparty string `json:"invalidparty"`
	Invalidtag   string `json:"invalidtag"`
}
